/*
 * SQLConsejoDAOFactory.java
 *
 * Created on 7 de noviembre de 2007, 22:45
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package webportlet.model.consejo.dao;

import java.sql.Connection;
import java.util.ArrayList;
import javax.sql.DataSource;
import webportlet.model.consejo.dto.ConsejoDTO;
import webportlet.model.util.GeneralOperations;
import webportlet.model.util.InternalErrorException;
import webportlet.model.util.SimpleDataSource;

/**
 *
 * @author Alvarete
 */
public class SQLConsejoDAOFactory {
    
    private final static String DAO_CLASS_NAME_PARAMETER =
        "SQLConsejoDAOFactory/daoClassName";

    private final static Class daoClass = getDAOClass();
    
    private SQLConsejoDAOFactory() {}
    
    private static Class getDAOClass() {
    
        Class theClass = null;
    
        try {
        
            // Coge los parametros del archivo ConfigurationParameters
            /*
            String daoClassName = //"model.user.StandarSQLUserDAO";
                ConfigurationParametersManager.getParameter(
                    DAO_CLASS_NAME_PARAMETER);
            
            theClass = Class.forName(daoClassName);*/
            theClass = Class.forName("webportlet.model.consejo.dao.CCSQLConsejoDAO");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return theClass;
        
    }
    
    public static SQLConsejoDAO getDAO() throws InternalErrorException {
        
        try {        
            return (SQLConsejoDAO) daoClass.newInstance();
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
        
    }
    
    /* 
     * Test code. Uncomment for testing. Test this class and any class
     * implementing "SQLUserDAO".
     */
    public static void main (String[] args) {                                     //
                                                                                  //
        Connection connection = null;                                             //
                                                                                  //
        try {                                                                     //
                                                                                  //
            /* Get a connection. */                                               //
            DataSource dataSource = new SimpleDataSource();                       //
            connection = dataSource.getConnection();                              //
                                                                                  //
            /* Get dao. */                                                        //
            SQLConsejoDAO dao = SQLConsejoDAOFactory.getDAO();                    //
                                                                                  //
            /* Test "SQLConsejoDAO::create". */                                   //
            System.out.println("Test for 'SQLConsejoDAO::create'");               //
            ConsejoDTO consejoDTO =                                               //
                    new ConsejoDTO(new Long(0),"Chiste",                          //
                    "Van dos y se cae el del medio");                             //
            consejoDTO = dao.create(connection, consejoDTO);                    //
            System.out.println("consejoDTO created => " + consejoDTO);          //
                                                                                  //
            /* Test "SQLConsejoDAO::exists". */                                  //
            System.out.println("Test for 'SQLConsejoDAO::exists'");              //
            if (!dao.exists(connection, consejoDTO.getId())) {                   //
                throw new Exception("Can not find consejo with " +               //
                    "id = " + consejoDTO.getId());                               //
            }                                                                     //
                                                                                  //
            /* Test "SQLConsejoDAO::find". */                                    //
            System.out.println("Test for 'SQLConsejoDAO::find'");                //
            System.out.println(dao.find(connection,consejoDTO.getId()));
                                                                                  //
            /* Test "SQLConsejoDAO::update". */                                  //
            System.out.println("Test for 'SQLConsejoDAO::update'");              //
            consejoDTO.setTipo("Consejo del dia");                                    //
            consejoDTO.setConsejo("Si el dia esta nublado, coge paraguas");       //
            dao.update(connection, consejoDTO);                                  //
            System.out.println(dao.find(connection, consejoDTO.getId()));        //
                                                                                  //
            /* Test "SQLConsejoDAO::remove". */                                  //
            System.out.println("Test for 'SQLConsejoDAO::remove'");              //
            dao.remove(connection, consejoDTO.getId());                          //
                                                                                  //
            if (dao.exists(connection, consejoDTO.getId())) {                    //
                throw new Exception("SQLConsejoDAO::remove failed");             //
            }
            
            /* Para hacer este test es necesario haber ejecutado los scripts
             * de creacion de base de datos.
             * Test "SQLConsejoDAO:recuperarlista". */
            System.out.println("Test for 'SQLConsejoDAO::recuperarlista'");
            ArrayList <Long> listaIds = new ArrayList();
            listaIds.add(new Long(1));
            ArrayList <ConsejoDTO> listaDTOs = new ArrayList();
            listaDTOs = dao.recuperarLista(connection,listaIds);
            for(int i=0; i<listaDTOs.size();i++){
                System.out.println(listaDTOs.get(i));
            }
                                                                                  //
            /* Tests OK. */                                                       //
            System.out.println("Tests OK !!!!");                                  //
                                                                                  //
        } catch (Exception e) {                                                   //
            e.printStackTrace();                                                  //
        } finally {                                                               //
            try {                                                                 //
                GeneralOperations.closeConnection(connection);                    //
            } catch (InternalErrorException e) {                                  //
                e.printStackTrace();                                              //
            }                                                                     //
        }                                                                         //
                                                                                  //
    }
    
}
